import java.util.*;

public class num373 {
    //给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。
    //定义一对值 (u,v)，其中第一个元素来自 nums1，第二个元素来自 nums2 。
    //请找到和最小的 k 个数对 (u1,v1),  (u2,v2)  ...  (uk,vk) 。
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        Queue<pair> queue = new PriorityQueue<>(new Comparator<pair>() {
            @Override
            public int compare(pair o1, pair o2) {
                return (o2.u + o2.v) - (o1.u + o1.v);
            }
        });
        //遍历两个数组，把和最小的前k对值保存到优先级队列中
        for (int i = 0; i < Math.min(nums1.length,k); i++) {
            for (int j = 0; j < Math.min(nums2.length,k); j++) {
                if(queue.size() < k){
                    queue.offer(new pair(nums1[i],nums2[j]));
                }else{
                    int p = (queue.peek().u + queue.peek().v);
                    if((nums1[i] + nums2[j]) < p){
                        queue.poll();
                        queue.offer(new pair(nums1[i],nums2[j]));
                    }
                }
            }
        }
        List<List<Integer>> list = new ArrayList<>();
        while (!queue.isEmpty()){
            List<Integer> list1 = new ArrayList<>();
            pair p = queue.poll();
            list1.add(p.u);
            list1.add(p.v);
            list.add(list1);
        }
        return list;
    }
}
class pair {
    int u;
    int v;

    public pair(int u,int v){
        this.u = u;
        this.v = v;
    }
}